package xmglsj;

import java.util.Scanner;
import java.util.Random;

public class PasswordManager {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int choice;

<<<<<<< HEAD

//同时修改并提交，完成所有功能


=======
>>>>>>> 7906e21824782e9fd37e3109a321290d0644e504
//增加两个新功能，加密和判断密码强度

        do {
            System.out.println("==============================");
            System.out.println("欢迎使用密码管理系统");
            System.out.println("==============================");
            System.out.println("请选择操作：");
            System.out.println("1. 加密");
            System.out.println("2. 解密");
            System.out.println("3. 判断密码强度");
            System.out.println("4. 密码生成");
            System.out.println("5. 退出");
            System.out.print("请输入选项序号：");
            choice = scanner.nextInt();
            scanner.nextLine(); // 消耗掉换行符

            switch (choice) {
                case 1:
                    System.out.println("请输入要加密的数字密码：");
                    String plainText = scanner.nextLine();
                    if (isValidPassword(plainText)) {
                        String encryptedText = encrypt(plainText);
                        System.out.println("加密后的结果是：" + encryptedText);
                    } else {
                        System.out.println("无效的密码");
                    }
                    break;
                case 2:
                    System.out.println("请输入要解密的数字密码：");
                    String encryptedText2 = scanner.nextLine();
                    String decryptedText = decrypt(encryptedText2);
                    System.out.println("解密后的结果是：" + decryptedText);
                    break;
                case 3:
                    System.out.println("请输入要判断强度的密码：");    //判断密码强度
                    String password = scanner.nextLine();
                    String strength = getPasswordStrength(password);
                    System.out.println("密码强度：" + strength);
                    break;
                case 4:
                    System.out.println("请输入要生成密码的长度：");
                    int length = scanner.nextInt();
                    scanner.nextLine(); // 消耗掉换行符
                    String generatedPassword = generatePassword(length);
                    System.out.println("生成的密码是：" + generatedPassword);
                    break;
                case 5:
                    System.out.println("退出程序");
                    break;
                default:
                    System.out.println("无效的选择");
            }

            System.out.println();
            System.out.println("按任意键返回");
            scanner.nextLine(); // 等待用户按下任意键继续
        } while (choice != 5);
    }

    public static String encrypt(String plainText) {
        char[] chars = plainText.toCharArray();  //对明文进行加密。首先将明文转换为字符数组
        int offset = 3;

        // 将每个字符的ASCII码加上它在字符串中的位置(1开始)和偏移值3
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] + i + offset);
        }

        // 将字符串反转
        StringBuilder reversedText = new StringBuilder(new String(chars)).reverse();

        // 将字符串的第一位和最后一位调换顺序
        if (reversedText.length() > 1) {
            char temp = reversedText.charAt(0);
            reversedText.setCharAt(0, reversedText.charAt(reversedText.length() - 1));
            reversedText.setCharAt(reversedText.length() - 1, temp);
        }

        return reversedText.toString();  //将加密后的字符串转换为字符串并返回
    }

    public static String decrypt(String encryptedText) {
        StringBuilder reversedText = new StringBuilder(encryptedText).reverse();  //对密文进行解密。首先将密文进行反转
        char[] chars = reversedText.toString().toCharArray();  //将反转后的字符串转换为字符数组
        int offset = 3;

        // 将字符串的第一位和最后一位调换顺序
        if (chars.length > 1) {
            char temp = chars[0];
            chars[0] = chars[chars.length - 1];
            chars[chars.length - 1] = temp;
        }

        // 将字符串反转后，将每个字符的ASCII码减去它在字符串中的位置(1开始)和偏移值3
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] - i - offset);
        }

        return new String(chars);
    }

    public static boolean isValidPassword(String password) {
        // 检查密码长度是否符合要求
        if (password.length() > 16) {  //检查密码是否符合要求。首先检查密码的长度是否超过16个字符
            return false;  //如果是则返回false
        }

        // 检查密码是否只包含数字和大小写字母
        for (char c : password.toCharArray()) {  //遍历密码的每个字符，检查是否只包含数字和大小写字母
            if (!Character.isLetterOrDigit(c)) {  //如果有其他字符则返回false
                return false;
            }
        }

        return true;  //如果密码符合要求，则返回true
    }

    public static String getPasswordStrength(String password) {
        if (password.length() < 8 || (password.length() >= 8 && !isValidPassword(password))) {
            return "弱强度";                            //如果密码的长度小于8，或者长度大于等于8但不符合要求，则返回"弱强度"
        } else if (password.length() >= 8 && isValidPassword(password)) {
            return "中强度";                            //如果密码的长度大于等于8且符合要求，则返回"中强度"
        } else {
            return "高强度";                            //否则返回"高强度"
        }
    }

    public static String generatePassword(int length) {
        String uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";         //定义了大写字母、小写字母、数字和符号的字符串
        String lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
        String digits = "0123456789";
        String symbols = "!@#$%^&*()_+-=[]{}|;':,.<>?";

        StringBuilder password = new StringBuilder();
        Random random = new Random();

        // 生成至少一个大写字母、一个小写字母和一个数字
                //创建一个StringBuilder对象用于存储生成的密码。接下来使用Random类生成随机数
        password.append(uppercaseLetters.charAt(random.nextInt(uppercaseLetters.length())));      //首先从大写字母字符串中随机选择一个字符
        password.append(lowercaseLetters.charAt(random.nextInt(lowercaseLetters.length())));      //然后从小写字母字符串中随机选择一个字符
        password.append(digits.charAt(random.nextInt(digits.length())));                          //最后从数字字符串中随机选择一个字符，将这三个字符添加到密码中


        // 生成剩余的字符
        for (int i = 0; i < length - 3; i++) {       //然后使用循环生成剩余长度减去3的字符，根据随机数的类型选择相应的字符类型，并将字符添加到密码中。
            int type = random.nextInt(4);
            switch (type) {
                case 0:
                    password.append(uppercaseLetters.charAt(random.nextInt(uppercaseLetters.length())));
                    break;
                case 1:
                    password.append(lowercaseLetters.charAt(random.nextInt(lowercaseLetters.length())));
                    break;
                case 2:
                    password.append(digits.charAt(random.nextInt(digits.length())));
                    break;
                case 3:
                    password.append(symbols.charAt(random.nextInt(symbols.length())));
                    break;
            }
        }

        return password.toString(); //将password转换为字符串并返回。
    }
}
//完成以上所有功能
